const utilsModule = ((Function) => {
  // context == ctx
  Function.prototype.MyCall = function (ctx) {
    // console.log(ctx);
    // console.log(arguments);

    ctx = ctx ? Object(ctx) : window;
    // origin 和 test公用一个内存地址
    ctx.originFn = this; // 引用
    var args = [];
    console.log(ctx.originFn); // [Function: test]

    for (var i = 1; i < arguments.length; i++) {
      args.push('arguments[' + i + ']')
    }

    // 1. ctx.originFn(['arguments[1]','arguments[2]'])
    // 2. ctx.originFn([arguments[1],arguments[2]])
    // 3. 'ctx.originFn([arguments[1],arguments[2]])'

    // console.log(args);               [ 'arguments[1]', 'arguments[2]' ]
    // console.log(args.toString());    arguments[1],arguments[2]
    var res = eval('ctx.originFn(' + args + ')') // 隐式转换,变成第三种
    delete ctx.originFn;
    return res
  }


})(Function)


// call test
// function test(){
//   console.log(this,arguments);

//   return 'Over'
// }

// function test1(){}

// var res = test.MyCall(
//   // a:2,
//   // b:2
//   true
// ,'zhangshan','lisi')  // { a: 1, b: 2 }
// console.log(res);


// apply test
function test() {
  console.log(this, arguments);
}

test.MyApply({
  a: 1,
  b: 2
}, [2, 3, 4])

